#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;

/*
 *
 * 给你一个 n x n 矩阵 matrix ，其中每行和每列元素均按升序排序，找到矩阵中第 k 小的元素。
请注意，它是 排序后 的第 k 小元素，而不是第 k 个 不同 的元素。

你必须找到一个内存复杂度优于 O(n2) 的解决方案。



示例 1：

输入：matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
输出：13
解释：矩阵中的元素为 [1,5,9,10,11,12,13,13,15]，第 8 小元素是 13
示例 2：

输入：matrix = [[-5]], k = 1
输出：-5
 *
 *
 *
 * */


int kthSmallest(vector<vector<int>> &matrix, int k) {
    //todo 我感觉我越做脑子越陷入一种傻逼状态
    vector<int> res;
    for (int i = 0; i < matrix.size(); ++i) {
        for (int j = 0; j < matrix[0].size(); ++j) {
            res.push_back(matrix[i][j]);
        }
    }
    sort(res.begin(), res.end());
    return res[k - 1];
}


int kthSmallest1(vector<vector<int>> &matrix, int k) {
    //todo 我感觉我越做脑子越陷入一种傻逼状态
    priority_queue<int> q;
    for (int i = 0; i < matrix.size(); ++i) {
        for (int j = 0; j < matrix[0].size(); ++j) {
            q.push(matrix[i][j]);
            if (q.size() > k) {
                q.pop();
            }
        }
    }

    return q.top();
}